/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = ibmmq_core.h                                                  */
/*  NOTE      =                                                               */
/*  DATE      = 2015/06/03 by wuwk                                            */
/******************************************************************************/
#ifndef _IBMMQ_CORE_H_
#define _IBMMQ_CORE_H_

#include "frmem.h"
#include "frct_comm.h"
#include "frdb_cursor.h"
#include "frreport_comm.h"
#include "frbyte_buffer.h"


#define IBMMQ_STR_TSH                     "TSH"
#define IBMMQ_STR_TSHM                    "TSHM"
#define IBMMQ_TSH_LEN                       3
#define IBMMQ_TSHx_LEN                      4

#define IBMMQ_HEAD_LEN_TSH                  28
#define IBMMQ_HEAD_LEN_TSHM                 36

#define IBMMQ_LEN_M                         1048576

#define IBMMQ_REQUEST                       0
#define IBMMQ_RESPONSE                      1
#define IBMMQ_UNKNOWN                       2

#define IBMMQ_MSG_PTP                       0
#define IBMMQ_MSG_PUB                       1
#define IBMMQ_MSG_NOTIFY                    2
#define IBMMQ_MSG_SUB                       3

#define IBMMQ_MSG_TYPE_TEXT_FLG             1
#define IBMMQ_MSG_TYPE_MAP_FLG              2
#define IBMMQ_MSG_TYPE_OBJ_FLG              3

/* 分片包数据 */
typedef struct __st_L7_fragment_ibmmq {
    unsigned int ui_left_head_len;          /* 残留的头数据长度 */
    unsigned int ui_recv_head_len;          /* 已经接收的头数据长度 */
    char arr_head[IBMMQ_HEAD_LEN_TSHM+1];   /* 头数据 */
    uint64_t u64_total_len;                 /* 实际数据总长度 */
    uint64_t u64_left_len;                  /* 还需要接收的数据长度 */
    Frbyte_Packet *p_st_data;               /* packet数据 */
} L7_fragment_ibmmq;

/* 头部 */
typedef struct __st_L7_head_ibmmq {
    char arr_structid[5];                   /* StructID */
    unsigned int ui_msg_len;                /* Message长度 */
    uint32_t u32_byte_order;                /* 数据读取方式 */
    uint32_t u32_segm_type;                 /* 请求类型 */
    unsigned int ui_head_len;               /* 头数据长度 */
    short s_ccsid;                          /* CCSID */
} L7_head_ibmmq;

/* 队列和Hdl结构体 */
typedef struct __st_queue_lst_ibmmq {
    char arr_queue[49];                          /* 队列名 */
    uint32_t u32_hdl;                              /* Hdl */
    struct __st_queue_lst_ibmmq *next;
} Queue_lst_ibmmq;

/* session信息 */
typedef struct __st_L7_session_ibmmq {
    char *p_username;                       /* 登录名 */
    char * p_server;                        /* 服务名 */
    struct timeval st_login;                /* 登录时间 */
    char *p_chanel;                         /* 通道名 */
    char *p_queue;                          /* 队列名 */
    char *p_title;                          /* title */
    Queue_lst_ibmmq *p_lst_queue;
} L7Session_ibmmq;

/*
 *  IBMMQ私有数据
*/
typedef struct __st_L7session_ibmmq_private {
    unsigned long ul_seq;                   /* 序列号，1次req和response时，使用同一个序列号 */
    int i_status_flag;                      /* status flag */
    int i_responserequired;                 /* 是否需要应答 */
    int i_pubsub_flag;                      /* flag IBMMQ_MSG_PTP/IBMMQ_MSG_PUB/IBMMQ_MSG_NOTIFY/IBMMQ_MSG_SUB */
    int i_msg_type;                         /* flag IBMMQ_MSG_TYPE_TEXT_FLG/IBMMQ_MSG_TYPE_MAP_FLG/IBMMQ_MSG_TYPE_OBJ_FLG */
    int i_msgfragment_flag;                 /* flag 消息分片标志 */
    unsigned int ui_left_msgfragment_len;   /* 分片包消息剩余长度 */
    L7_fragment_ibmmq *p_st_fragment;       /* 分片包数据 */
    L7_head_ibmmq *p_st_head;               /* 头部 */
    Frtrans_info st_trans_info;             /* 传输信息 */
    Frreport_body_data *p_st_data_req;      /* 请求上报数据 */
    Frreport_body_data *p_st_data_resp;     /* 响应上报数据 */
    Frlist_header *p_lst_req;               /* 请求信息 */
    Frlist_header *p_lst_mq;                /* mq信息 */
    L7Session_ibmmq *p_st_l7_session;       /* session信息 */
} L7session_ibmmq_private;


int ibmmq_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);
int ibmmq_analysis(Conntrack *p_st_conn
                  , Apm_packet *p_st_packet
                  , Frhash_header *p_st_hash_report);
int ibmmq_session_destroy(void *p_private_session);
void ibmmq_frlist_data_free(Frdata_field *p_st_node_data);

#endif
